package com.ccb.sc.order.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ccb.sc.order.controller.query.AppOrderCommonQueryParam;
import com.ccb.sc.order.vo.OrderCreateVo;
import com.ccb.sc.order.vo.OrderPreviewVo;
import com.ccb.sc.order.vo.OrderUpdateVo;
import com.ccb.sc.common.bind.page.PageParams;
import com.ccb.sc.common.bind.page.PageVo;
import com.ccb.sc.common.modules.order.entity.Order;
import com.ccb.sc.common.modules.order.vo.OrderCommentCreateVo;
import com.ccb.sc.common.modules.order.vo.OrderCommentListVo;
import com.ccb.sc.common.modules.order.vo.OrderDetailVo;
import com.ccb.sc.common.modules.order.vo.OrderListVo;
import com.ccb.sc.common.modules.payment.entity.Payment;

import javax.servlet.http.HttpServletRequest;

/**
 * <p>
 * 订单表 服务类
 * </p>
 *
 * @author ken
 * @since 2020-09-25
 */
public interface IAppOrderService extends IService<Order> {

    /**
     * 预览结算订单
     * @param memberId 用户id
     * @return OrderPreviewVo
     */
    OrderPreviewVo preview(Long memberId);

    /**
     * 提交订单
     * @param memberId 用户id
     * @param createVo 创建订单实体
     * @return String 订单id
     */
    String createOrder(Long memberId, OrderCreateVo createVo);

    /**
     * 重新提交更新订单
     * @param memberId 用户id
     * @param updateVo 创建订单实体
     * @return String 订单id
     */
    String updateOrder(Long memberId, OrderUpdateVo updateVo);

    /**
     * 商城订单支付回调
     * @param payment 支付流水单
     */
    void payment(Payment payment);

    /**
     * 订单列表
     * @param memberId 用户id
     * @param queryParam 查询条件
     * @return PageVo<OrderListVo>
     */
    PageVo<OrderListVo> list(Long memberId, AppOrderCommonQueryParam queryParam);

    /**
     * 订单列表
     * @param memberId 用户id
     * @param queryParam 查询条件
     * @return PageVo<OrderListVo>
     */
    PageVo<OrderCommentListVo> commentList(Long memberId, PageParams queryParam);

    /**
     * 订单详情
     * @param memberId 会员id
     * @param orderId 订单id
     * @return OrderDetailVo
     */
    OrderDetailVo detail(Long memberId, String orderId);

    /**
     * 再次购买
     * @param memberId 会员id
     * @param orderId 订单id
     * @return OrderPreviewVo
     */
    OrderPreviewVo rebuild(Long memberId, String orderId);

    /**
     * 再次购买
     * @param memberId 会员id
     * @param goodsSpecsId 商品规格id
     * @param quantity 数量
     * @return OrderPreviewVo
     */
    OrderPreviewVo directBuy(Long memberId, Long goodsSpecsId, Integer quantity, Boolean isGroupon);

    /**
     * 订单评价
     * @param memberId 用户id
     * @param createVo 评价信息
     * @param request request
     */
    void comment(Long memberId, OrderCommentCreateVo createVo, HttpServletRequest request);
}
